'use strict';
const { registerUserNameExistInfo, changeInfoFailInfo } = require('../utils/ErrorModel');
const Controller = require('egg').Controller;
const {
  SuccessModel,
  ErrorModel,
} = require('../utils/resultModel');
const {
  registerUserNameNotExistInfo,
  registerFailInfo,
} = require('../utils/ErrorModel');

class UserController extends Controller {
  // 获取登录信息
  getUserInfo() {
    let data = {
      isLogin: false, // 初始默认是未登录状态
    };

    // 如果用户已经登录
    const userInfo = this.ctx.session.userInfo;
    if (userInfo) {
      data = {
        isLogin: true,
        userName: userInfo.userName,
      };
    }

    return data;
  }

  // 登录页面
  async loginPage() {
    await this.ctx.render('login.html', this.getUserInfo());
  }
  // 注册页面
  async registerPage() {
    await this.ctx.render('register.html', this.getUserInfo());
  }
  // 个人设置页面
  async settingPage() {
    const userInfo = this.ctx.session.userInfo;
    await this.ctx.render('setting.html', {
      isNav: true,
      userInfo,
    });
  }
  async register() {
    // 获取到数据 用户名 密码 性别
    const {
      userName,
      password,
      gender,
    } = this.ctx.request.body;
    console.log(this.ctx.request.body);
    // 在service中做业务处理
    // try...catch 当语法错误时 会抛出异常(catch) 而不是终止服务
    try {
      const result = await this.service.user.createUser({
        userName,
        password,
        gender,
      });
      // 注册成功要自己关注自己，方便首页获取关注人的博客列表
      await this.service.userRelation.addFollower(result.id, result.id);
      // 当注册成功时 可以什么都不返回
      this.ctx.body = new SuccessModel();
    } catch (err) {
      // 打印错误信息 错误栈 以后有时间在讲
      console.log(err.message, err.stack);
      return new ErrorModel(registerFailInfo);
    }
  }
  async isExist() {
    const {
      userName,
    } = this.ctx.request.body;
    // service
    const getUserInfo = await this.service.user.getUserInfo(userName);
    console.log(getUserInfo);

    if (getUserInfo) {
      this.ctx.body = new SuccessModel(registerUserNameExistInfo);
    } else {
      this.ctx.body = new ErrorModel(registerUserNameNotExistInfo);
    }
  }
  // 登录
  async login() {
    // 获取前端请求的用户名和密码
    const { userName, password } = this.ctx.request.body;
    const userInfo = await this.service.user.doLogin({
      userName,
      password,
    });
    this.ctx.body = userInfo;
  }

  // 删除当前用户
  async deleteCurrentUser() {
    // 单元测试的情况下执行删除
    if (this.app.config.env === 'unittest') {
      // 在session中获取用户信息
      const {
        userName,
      } = this.ctx.session.userInfo;
      // 在service中删除用户信息
      const result = await this.service.user.deleteCurrentUser(userName);
      this.ctx.body = result;
    }
  }

  // 更改用户基本信息
  async changeUserInfo() {
    // 获取数据 昵称 城市 图片地址
    const {
      nickName,
      city,
      avatar,
    } = this.ctx.request.body;
    // 获取用户名 被更改人
    const {
      userName,
    } = this.ctx.session.userInfo;
    // 调用service中的updateUser(更新后面的值 查询条件)方法
    const result = await this.service.user.updateUser({
      newNickName: nickName,
      newCity: city,
      newAvatar: avatar,
    }, {
      userName,
    });
    // this.ctx.body = result;
    if (result) {
      Object.assign(this.ctx.session.userInfo, {
        nickName,
        city,
        avatar,
      });
      this.ctx.body = new SuccessModel();
    } else {
      this.ctx.body = new ErrorModel(changeInfoFailInfo);
    }
  }
  // 更改密码
  async changePassword() {
    const {
      userName,
    } = this.ctx.session.userInfo;
    const {
      newPassword,
      oldPassword,
    } = this.ctx.request.body;

    // 将数据交给service处理
    const result = await this.service.user.updateUser({
      newPassword,
    }, {
      userName,
      password: oldPassword,
    });

    this.ctx.body = result;
  }

  async logout() {
    // 在session中删除用户信息
    delete this.ctx.session.userInfo;
    this.ctx.body = new SuccessModel();
  }
  // 获取@列表
  async getAtList() {
    const { id } = this.ctx.session.userInfo;
    // 获取关注人列表
    const result = await this.service.userRelation.getFollower(id);
    // result = {count,userList}
    // ['王亮 - wangliang', .... ,'nickName - userName']
    const atList = result.userList.map(user => {
      return `${user.nickName} - ${user.userName}`;
    });
    this.ctx.body = atList;
  }
}

module.exports = UserController;
